package com.ray.basic;

import com.google.common.collect.*;

/**
 * 比较有用的有 multiMap, HashBasedTable
 * @author Ray
 */
public class C22NewCollectionTypes {

    public static void main(String[] args) {

        // multiMap来代替可能会用到的 Map<K, List<V>>, 这个倒是有用武之地。
        ListMultimap<Integer, String> multiMap = MultimapBuilder.hashKeys().arrayListValues().build();
        multiMap.put(1, "one");
        multiMap.put(1, "yi");
        multiMap.put(1, "1");
        multiMap.put(2, "two");
        multiMap.put(2, "er");
        multiMap.put(2, "2");
        multiMap.put(3, "3");
        multiMap.put(3, "3");
        // {1=[one, yi, 1], 2=[two, er, 2], 3=[3, 3]}
        System.out.println(multiMap.asMap());
        // [one, yi, 1]
        System.out.println(multiMap.get(1));
        // [1 x 3, 2 x 3, 3 x 2] 这是个multiSet, 这样可以用来计数
        System.out.println(multiMap.keys());
        // 3 就这么计数
        System.out.println(multiMap.keys().count(2));

        // biMap, 双向map, 这个可能有用, 但是需要两个key都是一一映射的, 不太清楚场合
        HashBiMap<String, String> nameAddressMap = HashBiMap.create();
        nameAddressMap.put("congyun", "127.0.0.1");
        // 127.0.0.1
        System.out.println(nameAddressMap.get("congyun"));
        // null
        System.out.println(nameAddressMap.inverse().get("congyun"));
        // congyun
        System.out.println(nameAddressMap.inverse().get("127.0.0.1"));

        // table, 看起来像是excel表格, 行号 + 列号 -> 值
        HashBasedTable<String, String, Integer> table = HashBasedTable.create();
        table.put("一年级", "24班", 59);
        table.put("二年级", "24班", 59);
        table.put("三年级", "24班", 60);
        table.put("三年级", "22班", 60);
        // 60
        System.out.println(table.get("三年级", "24班"));

        MutableClassToInstanceMap<Object> classToInstanceMap = MutableClassToInstanceMap.create();
        classToInstanceMap.put(Integer.class, Integer.valueOf(1));
        classToInstanceMap.put(Long.class, Long.valueOf("2"));
        System.out.println(classToInstanceMap.get(Integer.class));
        System.out.println(classToInstanceMap.get(Long.class));

        // 这个里面的东西必须是comparable的, 有序的去重的这种感觉
        TreeRangeSet<Integer> rangeSet = TreeRangeSet.create();
        rangeSet.add(Range.closedOpen(0, 5));
        rangeSet.add(Range.open(10, 20));
        System.out.println(rangeSet.contains(4));



    }

}
